/*
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang;

/**
 * {@code Compiler} 类用于支持 Java 到本机代码的编译器和相关服务。
 * 按设计，{@code Compiler} 类不执行任何操作；它作为 JIT 编译器实现的占位符。
 *
 * <p> 当 Java 虚拟机首次启动时，它确定系统属性 {@code java.compiler} 是否存在。
 * （系统属性可通过 {@link System#getProperty(String)} 和 {@link
 * System#getProperty(String, String)} 访问）。如果存在，则假定它是库的名称
 * （具有平台相关的确切位置和类型）；调用 {@link System#loadLibrary} 来加载该库。
 * 如果此加载成功，则调用该库中名为 {@code java_lang_Compiler_start()} 的函数。
 *
 * <p> 如果没有可用的编译器，这些方法不执行任何操作。
 *
 * @author  Frank Yellin
 * @since   JDK1.0
 */
public final class Compiler  {
    private Compiler() {}               // don't make instances

    private static native void initialize();

    private static native void registerNatives();

    static {
        registerNatives();
        java.security.AccessController.doPrivileged(
            new java.security.PrivilegedAction<Void>() {
                public Void run() {
                    boolean loaded = false;
                    String jit = System.getProperty("java.compiler");
                    if ((jit != null) && (!jit.equals("NONE")) &&
                        (!jit.equals("")))
                    {
                        try {
                            System.loadLibrary(jit);
                            initialize();
                            loaded = true;
                        } catch (UnsatisfiedLinkError e) {
                            System.err.println("Warning: JIT compiler \"" +
                              jit + "\" not found. Will use interpreter.");
                        }
                    }
                    String info = System.getProperty("java.vm.info");
                    if (loaded) {
                        System.setProperty("java.vm.info", info + ", " + jit);
                    } else {
                        System.setProperty("java.vm.info", info + ", nojit");
                    }
                    return null;
                }
            });
    }

    /**
     * 编译指定的类。
     *
     * @param  clazz
     *         一个类
     *
     * @return  如果编译成功则返回 {@code true}；如果编译失败或没有可用的编译器则返回 {@code false}
     *
     * @throws  NullPointerException
     *          如果 {@code clazz} 为 {@code null}
     */
    public static native boolean compileClass(Class<?> clazz);

    /**
     * 编译名称与指定字符串匹配的所有类。
     *
     * @param  string
     *         要编译的类的名称
     *
     * @return  如果编译成功则返回 {@code true}；如果编译失败或没有可用的编译器则返回 {@code false}
     *
     * @throws  NullPointerException
     *          如果 {@code string} 为 {@code null}
     */
    public static native boolean compileClasses(String string);

    /**
     * 检查参数类型及其字段并执行一些已记录的操作。不需要特定的操作。
     *
     * @param  any
     *         一个参数
     *
     * @return  编译器特定的值，如果没有可用的编译器则返回 {@code null}
     *
     * @throws  NullPointerException
     *          如果 {@code any} 为 {@code null}
     */
    public static native Object command(Object any);

    /**
     * 使编译器恢复操作。
     */
    public static native void enable();

    /**
     * 使编译器停止操作。
     */
    public static native void disable();
}
